Upgrading Applications
When an OLE 1
server is upgraded to an OLE 2 object application, several issues arise. A
primary issue is whether the OLE 2 application will replace the OLE 1
application or both versions will coexist. If only the newer version will be
available to the user, it is best to convert objects from the older version of
the application automatically to the new version format. Objects can be
converted on a global basis, where all objects of a specific class are
converted, or on a more selective basis, where only some objects are converted.
Conversion can be either automatic, under programmatic control, or under the
control of a user.
The ability
to detect whether an object is from an OLE 1 server is helpful for implementing
conversion functionality. The OLE 2 implementation of the IPersistStorage::Load method can check for
a stream named \1Ole10Native. The \1Ole10Native stream contains a DWORD
header whose value is the length of the native data that follows. The existence
of this stream indicates that the data is coming from an OLE 1 server.
Applications can check whether a storage object contains an object in an OLE 1
format by calling the ReadFmtUserTypeStg method and examining the contents of pcfFormat.
This is where the OLE 1 class name would appear.
In the IPersistStorage::Save method, objects that are
being permanently converted should be written back to storage in the new format
and the \1Ole10Native stream should be deleted. The conversion bit in the
storage should also be cleared once the conversion to the new format is
complete.
To allow
manual conversion of an old OLE 1 object to the new OLE 2 version, the OLE 2
object application must put the OLE 1 server s ProgID (OLE 1 server class name)
into the registry under the CLSID\{ ...}\Conversion\Readable\Main entry.
This entry indicates that the OLE 2 application can read its OLE 1 data format;
the Clipboard format of the OLE 1 data is the ProgID (that is, the class
name) of the OLE 1 object.
To get a
CLSID for an OLE 1 server, the CLSIDFromProgId function or the CLSIDFromString function must be called.
That is, an OLE 1 application cannot be assigned a CLSID from an OLE 2
application with uuidgen.exe, CoCreateGuid, or by using a GUID from a
range assigned by Microsoft. Because all OLE 1 CLSIDs are expected to fall in a
specific range, OLE 1 CLSIDs are assigned with the CLSIDFromProgId
function.
Refer to the
appendix called Registering Object Applications for detailed information on
the required registry entries for upgraded applications.